package com.example.demo.util;

import com.example.demo.model.util.FtpDTO;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class FtpUtil {

    private static FTPClient ftp;

    /**
     * 获取ftp连接
     *
     * @param f
     * @return
     * @throws Exception
     */
    public static boolean connectFtp(FtpDTO f) throws Exception {
        ftp = new FTPClient();
        if (f.getPort() == null) {
            ftp.connect(f.getIpAddr());
        } else {
            ftp.connect(f.getIpAddr(), f.getPort());
        }
        ftp.login(f.getUserName(), f.getPwd());
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        int reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            return false;
        }
        return true;
    }

    /**
     * 关闭ftp连接
     */
    public static void closeFtp() {
        if (ftp != null && ftp.isConnected()) {
            try {
                ftp.logout();
                ftp.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 下载链接配置
     *
     * @param f
     * @param localBaseDirurl  本地目录
     * @throws Exception
     */
    public static void startDown(FtpDTO f, String localBaseDirurl, String fileName) throws Exception {
        if (FtpUtil.connectFtp(f)) {
            try {
                boolean changedir = ftp.changeWorkingDirectory(f.getPath());
                if (changedir) {
                    ftp.setControlEncoding("utf-8");
                    File file = new File(f.getPath()+fileName.trim());
//                    boolean a =file.exists();
//                    if (file.exists()) {
                        downloadFile(file, localBaseDirurl, fileName);
//                    }
                }
            } catch (Exception e) {
                System.out.println(e);
                System.out.println("下载过程中出现异常");
            }
        } else {
            System.out.println("链接失败！");
        }

    }


    /**
     * 下载FTP文件
     * 当你需要下载FTP文件的时候，调用此方法
     * 根据<b>获取的文件名，本地地址，远程地址</b>进行下载
     * @param file
     * @param localBaseDirurl
     */
    private static void downloadFile(File file, String localBaseDirurl, String fileName) {
        if (!file.isFile()) {
            OutputStream outputStream = null;
            try {
                File locaFile = new File(localBaseDirurl + fileName);
                //判断文件是否存在，存在则返回
                if (locaFile.exists()) {
                    return;
                } else {
                    /** 创建文件夹 */
                    mkdirs(localBaseDirurl + fileName);
                    outputStream = new FileOutputStream(localBaseDirurl + fileName);
                    ftp.retrieveFile(fileName, outputStream);
                    outputStream.flush();
                    outputStream.close();
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            } finally {
                try {
                    if (outputStream != null) {
                        outputStream.close();
                    }
                    /** 关闭FTP连接 */
                    closeFtp();
                } catch (IOException e) {
                    System.out.println("输出文件流异常");
                }
            }
        }else {
            System.out.println("文件下载失败：");
        }
    }


    /**
     * 自动创建文件夹
     * @param file
     * @return
     */
    public static void mkdirs(String file){
        File outfile=new File(file);
        if(!outfile.getParentFile().exists()) {
            outfile.getParentFile().mkdirs();
        }
        if(outfile.isDirectory() && !outfile.exists()) {
            outfile.mkdir();
        }
    }
}
